//导入bcrypt
const bcrypt = require('bcryptjs')
//导入从数据库中获取数据的方法
const { getUserInfo } = require('../service/user.service')

const {
  userAlreadyExited,
  userFormateDateError,
  userRegisterError,
  userNotExist,
  userLoginError,
  invalidPassword
} = require('../constant/err.type')

//合法性检查,如果用户名或密码为空，返回错误
const userValidator = async (ctx, next) => {
  //获取数据
  const { username, password } = ctx.request.body

  if (!username || !password) {
    console.error('用户名或密码为空', ctx.request.body)

    //错误处理，第一个参数为触发的时间，第二个为错误返回的格式，第三个为上下问对象
    ctx.app.emit('error', userFormateDateError, ctx)
    return
  }
  await next()
}

//注册时合理性检查，
const verifyUser = async (ctx, next) => {
  //1.获取数据
  const { username, password } = ctx.request.body

  try {
    const result = await getUserInfo({ username })
    //合理性
    if (result) {
      console.error('用户名已存在', ctx.request.body)
      //错误处理，第一个参数为触发的时间，第二个为错误返回的格式，第三个为上下问对象
      ctx.app.emit('error', userAlreadyExited, ctx)
      return
    }
  } catch (err) {
    console.error('获取用户信息失败', err) //写入日志
    ctx.app.emit('error', userRegisterError, ctx)
    //不要忘记写return
    return
  }
  await next()
}

//注册时密码加密
const crpytPassword = async (ctx, next) => {
  const { password } = ctx.request.body

  //加盐
  const salt = bcrypt.genSaltSync(10)
  //hash保存的是密文
  const hash = bcrypt.hashSync(password, salt)

  ctx.request.body.password = hash

  await next()
}

const verifyLogin = async (ctx, next) => {
  //1.判断用户是否存在
  const { username, password } = ctx.request.body

  try {
    const res = await getUserInfo({ username })
    if (!res) {
      console.error('用户名不存在', { username })
      ctx.app.emit('error', userNotExist, ctx)
      return
    }

    console.log(res.password,password,bcrypt.compareSync(password, res.password))
   // return
    //2.密码是否匹配
    if (!bcrypt.compareSync(password, res.password)) {
      ctx.app.emit('error', invalidPassword, ctx)
      return
    }
  } catch (err) {
    console.error(err) //写入日志
    ctx.app.emit('error', userLoginError, ctx)
    //不要忘记写return
    return
  }

  await next()
}

module.exports = {
  userValidator,
  verifyUser,
  crpytPassword,
  verifyLogin
}
